package vn.vfriends.soffice.bean;

import java.io.Serializable;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.context.RequestContext;
import org.primefaces.model.TreeNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import vn.vfriends.soffice.model.Group;
import vn.vfriends.soffice.service.GroupService;

/**
 *
 * @author chaungoctuan@gmail.com
 */
@Named
@ViewScoped
public class GroupBean implements Serializable {

    private static final Logger logger = LoggerFactory.getLogger(GroupBean.class);
    
    @Inject private GroupService groupService;
    
    private Group[] selectedGroups;
    
    private Group group;
    
    private Integer groupId;
    
    private TreeNode root;

    private TreeNode[] selectedNodes;
    
    public TreeNode getRoot() {
        return root;
    }

    public void setRoot(TreeNode root) {
        this.root = root;
    }

    public TreeNode[] getSelectedNodes() {
        return selectedNodes;
    }

    public void setSelectedNodes(TreeNode[] selectedNodes) {
        this.selectedNodes = selectedNodes;
    }

    public Integer getGroupId() {
        return groupId;
    }

    public void setGroupId(Integer groupId) {
        this.groupId = groupId;
    }

    public Group[] getSelectedGroups() {
        return selectedGroups;
    }

    public void setSelectedGroups(Group[] selectedGroups) {
        this.selectedGroups = selectedGroups;
    }

    public Group getGroup() {
        return group;
    }

    public void setGroup(Group group) {
        this.group = group;
    }
    
    public List<Group> getGroupList() {
        return this.groupService.findAll();
    }
    
    public void preEditAction() {
        try {
            if (this.selectedGroups == null || this.selectedGroups.length == 0) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Thông báo", "Hãy chọn một nhóm");
                RequestContext.getCurrentInstance().showMessageInDialog(message);
            } else if (this.selectedGroups.length > 1) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Thông báo", "Chỉ chọn một nhóm");
                RequestContext.getCurrentInstance().showMessageInDialog(message);
            } else {
                this.group = this.selectedGroups[0];
                Map<String,List<String>> params = new HashMap<>();
                params.put("groupId", Arrays.asList(this.group.getId().toString()));
                RequestContext.getCurrentInstance().openDialog("edit", null, params);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Lỗi hệ thống");
            RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }
    
    public void preRenderEditView() {
        this.group = this.groupService.find(groupId);
        if(this.group == null) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Nhóm người dùng không tồn tại");
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }
    
    public void updateAction() {
        try {
            this.groupService.edit(this.group);
            RequestContext.getCurrentInstance().closeDialog("editDialog");
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Lỗi hệ thống");
            RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }
    
    public void preNewAction() {
        RequestContext.getCurrentInstance().openDialog("new");
    }
    
    public void preRenderNewView() {
        this.group = new Group();
    }
    
    public void saveAction() {
        try {
            this.groupService.create(this.group);
            RequestContext.getCurrentInstance().closeDialog("newDialog");
        } catch (Exception ex) {
            logger.error(ex.getMessage(), ex);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Lỗi hệ thống");
            RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }
    
    public void preDeleteAction() {
        try {
            if (this.selectedGroups == null || this.selectedGroups.length == 0) {
                RequestContext.getCurrentInstance().addCallbackParam("invalid", true);
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Thông báo", "Hãy chọn một hoặc nhiều nhóm");
                RequestContext.getCurrentInstance().showMessageInDialog(message);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Lỗi hệ thống");
            RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }
    
    public void deleteAction() {
        try {
            for (Group selectedGroup : selectedGroups) {
                this.groupService.remove(selectedGroup);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Lỗi hệ thống");
            RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }
    
    public void preGrantAction() {
        try {
            if (this.selectedGroups == null || this.selectedGroups.length == 0) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Thông báo", "Hãy chọn một nhóm");
                RequestContext.getCurrentInstance().showMessageInDialog(message);
            } else if (this.selectedGroups.length > 1) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Thông báo", "Chỉ chọn một nhóm");
                RequestContext.getCurrentInstance().showMessageInDialog(message);
            } else {
                this.group = this.selectedGroups[0];
                Map<String,List<String>> params = new HashMap<>();
                params.put("groupId", Arrays.asList(this.group.getId().toString()));
                
                Map<String,Object> options = new HashMap<>();
                options.put("contentHeight", 500);
                
                RequestContext.getCurrentInstance().openDialog("grant", options, params);
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Lỗi hệ thống");
            RequestContext.getCurrentInstance().showMessageInDialog(message);
        }
    }
    
    public void preRenderGrantView() {
        this.group = this.groupService.find(groupId);
        if(this.group == null) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Nhóm người dùng không tồn tại");
            FacesContext.getCurrentInstance().addMessage(null, message);
        } else {
            //this.initNode();
        }
    }
    
//    public void grantAction() {
//        try {
//            if(selectedNodes != null && selectedNodes.length > 0) {
//                List<Menu> grantedMenus = new ArrayList<>();
//                List<Permission> grantedPermissions = new ArrayList<>();
//                for(TreeNode node : selectedNodes) {
//                    Object data = node.getData();
//                    if(data instanceof Menu) {
//                        grantedMenus.add((Menu)data);
//                    } else if(data instanceof Permission) {
//                        grantedPermissions.add((Permission)data);
//                    }
//                }
//                this.group.setMenus(grantedMenus);
//                this.group.setPermissions(grantedPermissions);
//            }
//            
//            this.groupService.edit(this.group);
//            RequestContext.getCurrentInstance().closeDialog("grantDialog");
//        } catch (Exception ex) {
//            logger.error(ex.getMessage(), ex);
//            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Thông báo", "Lỗi hệ thống");
//            RequestContext.getCurrentInstance().showMessageInDialog(message);
//        }
//    }
//    
//    private void initNode() {
//        root = new CheckboxTreeNode("Menu/quyền", null);
//        List<Menu> menus = this.menuService.findFirstLevel();
//        for(Menu menu : menus) {
//            this.initNode(menu, root);
//        }
//    }
}
